package com.xadrez.view;

import com.xadrez.Principal;
import com.xadrez.exception.PecaNaoPossuiPecaViewException;
import com.xadrez.modelo.Jogador;
import com.xadrez.modelo.Peca;
import com.xadrez.modelo.Posicao;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.util.List;
import javax.swing.JLabel;

public class Pintor {

    //Pinta quadradros referentes aos movimentos possíveis de uma peça
    public static void pintaQuadrados(PecaView pecaView) {
        limpaTabuleiro();
        pintaPosicaoAtual(pecaView);

        Peca peca = pecaView.getPeca();
        if (peca.getJogador().equals(Principal.getTabuleiro().getJogadorDaVez())) {
            pintaMovimentosPossiveis(peca);
        }
    }

    public static void pintaPosicaoAtual(PecaView pecaView) {
        Posicao temp = TabuleiroView.getInstance().getPosicaoNaView(pecaView.getPeca().getPosicaoNoTabuleiro());
        Component componentTemp = TabuleiroView.getInstance().findComponentAt(temp.getX(), temp.getY());
        Container parent = componentTemp.getParent();
        parent.setBackground(Cor.getInstance().getCorPecaJogador());
    }

    private static void pintaMovimentosPossiveis(Peca peca) {
        List<Posicao> posicoes = peca.recuperaMovimentosPossiveis();

        for (Posicao posicao : posicoes) {
            Posicao temp = TabuleiroView.getInstance().getPosicaoNaView(posicao);
            pinta(temp.getX(), temp.getY());
        }
    }
   
    //Pinta quadradros referentes aos movimentos possíveis de uma peça
     private static void pinta(int x, int y) {
        Component c = TabuleiroView.getInstance().findComponentAt(x, y);
        PecaView pecaView = TabuleiroView.getInstance().buscaPeca(x, y);

        if (pecaView != null) {
            Container parent = c.getParent();
            if (pecaView.getPeca().getJogador().equals(Principal.getTabuleiro().getJogadorAdversario())) {
                parent.setBackground(Cor.getInstance().getCorPecaInimigo());
            }
        } else {
            if (c != null) {
                Container parent = (Container) c;
                parent.setBackground(Cor.getInstance().getCorCampoLivre());
            }
        }
    }

    //Repinta o tabuleiro com as cores iniciais, limpando desenhos de movimento.
    public static void limpaTabuleiro() {
        for (int i = 0; i < 64; i++) {
            Component c = TabuleiroView.getInstance().getComponent(i);

            int row = (i / 8) % 2;
            if (row == 0) {
                if (c instanceof JLabel) {
                    Container parent = c.getParent();
                    parent.setBackground(i % 2 == 0 ? Cor.getInstance().getCorTabuleiro() : Color.white);
                } else {
                    Container parent = (Container) c;
                    parent.setBackground(i % 2 == 0 ? Cor.getInstance().getCorTabuleiro() : Color.white);
                }
            } else {
                if (c instanceof JLabel) {
                    Container parent = c.getParent();
                    parent.setBackground(i % 2 == 0 ? Color.white : Cor.getInstance().getCorTabuleiro());
                } else {
                    Container parent = (Container) c;
                    parent.setBackground(i % 2 == 0 ? Color.white : Cor.getInstance().getCorTabuleiro());
                }
            }
        }
    }

    public static void pintaCheck(Jogador jogador1, Jogador jogador2) throws PecaNaoPossuiPecaViewException {
        if (jogador1.getReiDoJogador().isInCheck()) {
            Posicao posicao = TabuleiroView.getInstance().getPosicaoNaView(jogador1.getReiDoJogador().getPosicaoNoTabuleiro());
            Component c = TabuleiroView.getInstance().findComponentAt(posicao.getX(), posicao.getY());
            if (c == null) {
                throw new PecaNaoPossuiPecaViewException();
            } else {
                Container parent = c.getParent();
                parent.setBackground(Cor.getInstance().getCorPecaInimigo());
            }
        } else if (jogador2.getReiDoJogador().isInCheck()) {
            Posicao posicao = TabuleiroView.getInstance().getPosicaoNaView(jogador2.getReiDoJogador().getPosicaoNoTabuleiro());
            Component c = TabuleiroView.getInstance().findComponentAt(posicao.getX(), posicao.getY());
            if (c == null) {
                throw new PecaNaoPossuiPecaViewException();
            } else {
                Container parent = c.getParent();
                parent.setBackground(Cor.getInstance().getCorPecaInimigo());
            }
        }
    }
}
